package usuario;

import java.beans.XMLEncoder;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;


public class Usuario {

	private String login;
	private String senha;
	private String nome_exibicao;
	private String email;
	private String sexo;
	private String endereco; 
	private String interesses; 
	private String quem_sou_eu;
	private String filmes;
	private String musicas;
	private String livros;
	private String dataNasc;

	//adicionar verificacao de campo unico em: login e senha

	public Usuario(String login, String senha, String nome_exibicao,
			String email, String sexo, String dataNasc, String endereco, String interesses,
			String quem_sou_eu, String filmes, String musicas, String livros) throws Exception {
		
		try{
			if (verifica_login_invalido(login))
				throw new Exception("Login inválido");
		}catch (Exception e){
			throw new Exception("Login inválido");
		}
		
		try{
			if(verifica_senha_invalida(senha))
				throw new ExceptionInInitializerError("Senha inválida");
		}catch (Exception e){
			throw new Exception("Senha inválida");
		}
		
		try{
			if(verifica_email_invalido(email))
				throw new ExceptionInInitializerError("Email inválido");
		}catch (Exception e){
			throw new Exception("Email inválido");
		}
		
		this.login = login;
		this.senha = senha;
		
		if(nome_exibicao == null)
			setNome_exibicao(login);
		else if (valida_informacao_string(nome_exibicao))
			setNome_exibicao(nome_exibicao);
		else setNome_exibicao(login);
		
		if(valida_email(email))
			setEmail(email);
		else setEmail("");
		
		this.email = email;
		 
		if(valida_sexo(sexo))
			setSexo(sexo);
		else throw new Exception("Sexo inválido");
		
		this.dataNasc = dataNasc;
		
		if(valida_informacao_string(endereco))
			setEndereco(endereco);
		else setEndereco("");
		
		if(valida_informacao_string(interesses))
			setInteresses(interesses);
		else setInteresses("");
		
		if(valida_informacao_string(quem_sou_eu))
			setQuem_sou_eu(quem_sou_eu);
		else setQuem_sou_eu("");
		
		if(valida_informacao_string(filmes))
			setFilmes(filmes);
		else setFilmes("");
		
		if(valida_informacao_string(musicas))
			setMusicas(musicas);
		else setMusicas("");
		
		if(valida_informacao_string(livros))
			setLivros(livros);
		else setLivros("");

	}

	//--------------Verificadores de obrigacao----------------------
	public boolean verifica_login_invalido(String login) {
		if (login.equals("") || login == null) 
			return true;
		return false;
	}

	public boolean verifica_senha_invalida(String senha) {
		if (senha.equals("")||senha == null) return true;
		else return false;
	}

	public boolean verifica_email_invalido(String email) {
		if (email.equals("") || email == null) return true;
		else return false;
	}

	//--------------------------------------------------------------
	
	//-------------Gets e Sets-------------------------------------
	
	public static String getInformationProfile(Usuario user, String atributo){
		return "";
	}
	
	public String getlogin() {
		return login;
	}

	public void setlogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNome_exibicao() {
		return nome_exibicao;
	}

	public void setNome_exibicao(String nomeExibicao) {
		nome_exibicao = nomeExibicao;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getInteresses() {
		return interesses;
	}

	public void setInteresses(String interesses) {
		this.interesses = interesses;
	}

	public String getQuem_sou_eu() {
		return quem_sou_eu;
	}

	public void setQuem_sou_eu(String quemSouEu) {
		quem_sou_eu = quemSouEu;
	}

	public String getFilmes() {
		return filmes;
	}

	public void setFilmes(String filmes) {
		this.filmes = filmes;
	}

	public String getMusicas() {
		return musicas;
	}

	public void setMusicas(String musicas) {
		this.musicas = musicas;
	}

	public String getLivros() {
		return livros;
	}

	public void setLivros(String livros) {
		this.livros = livros;
	}
	
	public String getDataNasc() {
		return dataNasc;
	}

	public void setDataNasc(String dataNasc) {
		this.dataNasc = dataNasc;
	}
	
	//------------------------------------------------------------
	//--------------Validadores-----------------------------------
	
	
	public boolean valida_email(String email){
		if(email.equals(""))
			return false;
		String[] eMail = email.split("@");
		if(eMail.length > 2 || eMail.length <= 1)
			return false;
		//verificar se existe mais invalidacao em email		
		return true;
	}
	
	/**
	 * Verifica a validade do sexo
	 * @param sexo
	 * @return true- se o sexo for valido
	 *         false- caso contrario
	 */
	public boolean valida_sexo(String sexo){
		if(sexo.equals("Feminino") || sexo.equals("Masculino") || sexo.equals("Não informado"))
			return true;
		return false;
	}
	
	public boolean valida_informacao_string(String informacao){
		//se tiver pelo menos uma letra entao a informacao eh valida
		for (int i = 0; i < informacao.length(); i++) {
			if(Character.isLetter(informacao.charAt(i)))
				return true;
		}
		return false;
	}
	
	public static boolean imp(String end){
		System.out.println(end + " eh: "+ end.charAt(0));
		return Character.isLetterOrDigit(end.charAt(0));
	}
	
	
	/**Verifica se uma determinada data eh valida
	 * 
	 * @param dataATestar a data que sera verificada
	 * @return true, caso a data seja legal, false, ilegal
	 * @throws ParseException
	 */
	private boolean valida_data(String dataATestar) throws ParseException{
		try{// leva em consideracao que a data esta no minino, no formato certo				
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		Calendar cal = new GregorianCalendar();

		// gerando o calendar
		cal.setTime(df.parse(dataATestar));

		// separando os dados da string para comparacao e validacao
		String[] data = dataATestar.split("/");
		String dia = data[0];
		String mes = data[1];
		String ano = data[2];

		// testando se hah discrepancia entre a data que foi
		// inserida no caledar e a data que foi passada como
		// string. se houver diferenca, a data passada era
		// invalida
		if ((new Integer(dia)).intValue() != (new Integer(
				cal.get(Calendar.DAY_OF_MONTH))).intValue()) {
			// dia nao casou
			return (false);
		} else if ((new Integer(mes)).intValue() != (new Integer(
				cal.get(Calendar.MONTH) + 1)).intValue()) {
			// mes nao casou
			return (false);
		} else if ((new Integer(ano)).intValue() != (new Integer(
				cal.get(Calendar.YEAR))).intValue()) {
			// ano nao casou
			return (false);
		}
		}catch(Exception e){//se ela nao estiver no formato certo
			return false;
		}

		return (true);
		
	}
	
	
	/**
	private boolean valida_data(String data){
		//if(data.equals("")) return false;
		String[] datas = data.split("/");
		if(datas.length > 3)
			return false;
		if(datas[0].charAt(0) < 0 && datas[0].charAt(0) > 3)
			//verifica se a data eh menor que 0x e maior que 3x
			return false;
		for (int i = 0; i < datas.length; i++) {
			System.out.println(datas[i]);
		}
	}
	 * @throws Exception 
	 * @throws Exception 
	**/
	//perguntar se usa o gregorian Calendar ou fazer a classe data
	
	//--------------------------------------------------------------------------
	 public static void main(String[] args) throws Exception {
	        Usuario user = new Usuario("annelorayne", "sasa", "anne", "anne@gmail.com", "Feminino", "", "", "", "", "", "", "");
	        
	        /**
	        user.setId(new Long(1));
	        System.out.println("17");
	        bean.setItemName("T-Shirt");
	        System.out.println("19");
	        bean.setItemColour("Dark Red");
	        bean.setItemQuantities(new Integer(100));
	        **/
	        try {
	            XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(
	                    new FileOutputStream("xml.Bean.xml")));
	            System.out.println("enconder");

	            //
	            // Write an XML representation of the specified object to the output.
	            //
	            encoder.writeObject(user);
	            System.out.println("escreveu");
	            encoder.close();
	            System.out.println("fechou");
	        } catch (FileNotFoundException e) {
	            e.printStackTrace();
	        }
	    }

	    
	
	
	
	
	//--------------------------------------------------------------------------
	//public static void main(String[] args) throws Exception {
		//Usuario user1 = new Usuario("login", "senha", null, "email", "Feminino", "dataNasc", "endereco", "interesses", "quem_sou_eu", "filmes", "musicas", "livros");
		//System.out.println(user1.getInformationProfile(user1,"nome_exibicao"));
	//}
}
